Jerry's Log

Binary Tree & BST

contents

이진 트리(Binary Tree)이진 탐색 트리(Binary Search Tree, BST) 의 상세한 분석, 둘의 차이점, 그리고 이것들이 왜 중요한지에 대한 설명입니다.


1부: 이진 트리 (기초 단계)

이진 트리는 계층적인 데이터 구조입니다. 선형적인 배열이나 연결 리스트와 달리, 트리는 나뭇가지처럼 뻗어 나갑니다.

"이진(Binary)"이라는 단어는 단순히 "두 개" 를 의미합니다. 이진 트리에서 모든 데이터(이를 노드(Node) 라고 부름)는 최대 두 개의 자식(왼쪽 자식과 오른쪽 자식)을 가질 수 있습니다.

1. 트리의 구조 (해부학)

2. 이진 트리의 종류

모든 이진 트리가 같은 모양을 하고 있는 것은 아닙니다. 트리의 모양이 효율성을 결정합니다.

3. 트리 순회 (데이터를 읽는 방법)

트리는 선형적이지 않기 때문에, 단순히 왼쪽에서 오른쪽으로 읽을 수 없습니다. 모든 노드를 방문하기 위해 "순회(Traversals)"라는 방법을 사용합니다.


2부: 이진 탐색 트리 (똑똑한 트리)

일반적인 이진 트리는 데이터가 어디에 들어가야 하는지에 대한 규칙이 없습니다. 일반 이진 트리에서 숫자 15를 찾으려면, 찾을 때까지 모든 노드를 하나하나 다 뒤져야 합니다.

이진 탐색 트리(BST) 는 여기에 단 하나의 절대 규칙(Golden Rule)을 추가하여 이 문제를 해결합니다:

BST의 절대 규칙: 어떤 노드를 기준으로 하든, 왼쪽 서브트리에 있는 모든 값은 더 작아야 하고, 오른쪽 서브트리에 있는 모든 값은 더 커야 합니다.

1. 이것이 왜 그렇게 강력할까요? (사전 효과)

사전에서 "Mango"라는 단어를 찾는다고 상상해 보세요. 1페이지, 2페이지 순서대로 읽지 않겠죠. 사전의 중간을 딱 폅니다. 만약 "Orange"가 나왔다면, "Mango"는 그 앞에 있다는 것을 알 수 있으니 사전의 오른쪽 절반은 아예 찢어서 버려도 됩니다. 단 한 번의 행동으로 해야 할 일의 50%를 제거한 것입니다.

BST가 정확히 이 역할을 합니다.

2. 핵심 연산 및 시간 복잡도

트리를 한 칸씩 내려갈 때마다 남은 노드의 절반이 날아가기 때문에, 잘 구조화된 BST는 믿을 수 없을 정도로 빠릅니다.

연산 평균적인 경우 (균형 트리) 최악의 경우 (퇴화 트리)
탐색 (Search) $O(\log n)$ $O(n)$
삽입 (Insert) $O(\log n)$ $O(n)$
삭제 (Delete) $O(\log n)$ $O(n)$

3부: 치명적인 결함과 해결책

위 표에서 "최악의 경우" 시간 복잡도가 $O(n)$인 것을 눈치채셨나요? 왜 그럴까요?

"퇴화된(Degraded)" 트리 문제

이미 정렬된 순서대로 숫자를 BST에 삽입한다고 상상해 보세요: 1, 2, 3, 4, 5.

이제 이것은 나뭇가지처럼 뻗어 나가는 트리가 아니라, 오른쪽으로만 길게 늘어진 연결 리스트(Linked List) 가 되어버립니다. "사전 효과"는 완전히 사라졌습니다. 5를 찾으려면 모든 노드를 다 거쳐야만 합니다 ($O(n)$).

해결책: 자가 균형 트리 (Self-Balancing Trees)

이 문제를 방지하기 위해, 엔지니어들은 데이터를 삽입/삭제할 때 스스로 균형을 맞추는 진화된 버전의 BST를 발명했습니다. 트리의 한쪽이 너무 무거워지면, 수학적인 "회전(Rotation)"을 수행하여 루트를 끌어내리고 자식을 밀어 올려서 균형을 복구합니다.

references